package estructuras;

import servclien.Server.ClientThread;



public class SLL {
    
    private SLLNode _head;
    private SLLNode _tail;
    private int     _length = 0;
    
    public SLL(){
        _head=null;
        _tail=null;
        _length = 0; 
    }

    public int getLength() {
        return _length;
    }

    public void setLength(int _length) {
        this._length = _length;
    }
    
   
    
    public static SLL unirListasSimples(SLLNode pHeadLista1, SLLNode pHeadLista2) {
        SLL aux = new SLL();
        
        for(SLLNode temp = pHeadLista1 ;temp != null;temp = temp._next){
            aux.meterFinal(temp._elemento);
        }
        for(SLLNode temp = pHeadLista2;temp != null;temp = temp._next){
            aux.meterFinal(temp._elemento);
        }
        aux.imprimir();
        
        return aux;        
    }
    
    
    public SLLNode crearNodo(ClientThread pPorCrear){
        SLLNode temp = new SLLNode(pPorCrear);
        return temp;
    }
    
    public void meterHead(SLLNode tmp){       
        _head = _tail = tmp;
        _length++;
        
    }
    
    public void meterFinal(ClientThread pPorMeter){
        SLLNode temp = crearNodo(pPorMeter);
        if (_length == 0){
            meterHead(temp);
        }
        else{
            _tail._next = temp;
            _tail = temp;                           
            _length++;         
        }   
    }
    
    public ClientThread obtenerPorPosicion (int pCasillaPorObtener){
       
        if (pCasillaPorObtener == 1){            
            return _head._elemento;            
        }        
        else{            
            int contador = 2;
            SLLNode temp = _head._next;
            while(contador  != pCasillaPorObtener){
                temp = temp._next;
                contador++;
            }
            return temp._elemento;
        }
        
        
    }
    
    public void eliminaPorPosicion (int pCasillaPorEliminar){
        if (pCasillaPorEliminar == 1){
            _head = _head._next;  
            _length--;          
        }
        else{
            int contador = 1;
            SLLNode temp = _head;
            while(contador +1 != pCasillaPorEliminar){
                temp = temp._next;
                contador++;
            }
            temp._next = temp._next._next;
            _length--;
        }
        
        
    }
    
    public boolean buscarYDarPosicion(Object pPorBuscar){
        int posicion = 1;
        for (SLLNode temp = _head; temp != null; temp = temp._next){
            if (temp._elemento == pPorBuscar){
                System.out.println("true, esta en la posicion es: " +posicion);
                eliminaPorPosicion(posicion);
                return true;
            }
            posicion++;
        }
        System.out.println("false, no se encontró el elemento");
        return false;
    }
    
    public void imprimir(){
        for (SLLNode aux = _head; aux != null; aux = aux._next) {
            System.out.print(aux._elemento + ", ");
        }
        System.out.println("");
        System.out.println("tamaño_lista = "+_length);
    }
    
//    public static void main(String[] args) {  
//        SLL listaSimple1 = new SLL();
//        SLL listaSimple2 = new SLL(); 
//        
//        listaSimple1.meterFinal(1);
//        listaSimple1.meterFinal(2);
//        listaSimple1.meterFinal(3);
//        listaSimple1.meterFinal(4);
//        listaSimple1.meterFinal(5);
//        listaSimple1.meterFinal(6);
//        listaSimple1.meterFinal(7);
//        listaSimple1.meterFinal(8);
//        listaSimple1.meterFinal(9);
//        System.out.println("lista 1");
//        listaSimple1.imprimir();
//        
//        listaSimple2.meterFinal(11);
//        listaSimple2.meterFinal(12);
//        listaSimple2.meterFinal(13);
//        listaSimple2.meterFinal(14);
//        listaSimple2.meterFinal(15);
//        listaSimple2.meterFinal(16);
//        listaSimple2.meterFinal(17);
//        listaSimple2.meterFinal(18);
//        listaSimple2.meterFinal(19);
//        System.out.println("lista 2");
//        listaSimple2.imprimir();
//        
//        
//        listaSimple.imprimir();
//        
//        listaSimple.buscarYDarPosicion(5);
//        
//        listaSimple.imprimir();
//         
//        SLL listaSimple3 ;
//        listaSimple3 = unirListasSimples(listaSimple2._head,listaSimple1._head);
//         
//         listaSimple3.ordenar();
//    }
//    
}
